package com.seanLab.tool;

import com.seanLab.configuration.ModelConfig;
import com.seanLab.domain.TagInfo;
import com.seanLab.dto.RecommendArticleDto;
import com.seanLab.dto.SuggestArticleKeywordsDto;
import com.seanLab.dto.SuggestModelArticleDto;
import com.seanLab.tool.TagSuggestModel.StaticModelProperties;
import com.seanLab.tool.TagSuggestModel.TagSuggestModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 关键词标注／提取模型的接口
 * 先执行loadModel和loadLDAModel加载模型
 * Created by BodeNg on 2017/9/12.
 */
@Component
public class TagSuggestor{
    @Autowired
    private ModelConfig modelConfig;

    private TagSuggestModel tagSuggestModel;

    public TagSuggestor() {
        tagSuggestModel = new TagSuggestModel();
    }

    /***
     * 训练／标注模块
     * @param article 待标注的带图文章
     * @return 一个结果列表，每个结果包括文章中各个图片所标注的tags
     */
    public List<List<TagInfo>> doTag(SuggestModelArticleDto article) {
//        System.out.println(StaticModelProperties.NumOfTag);
        return tagSuggestModel.suggestTagOfImagedArticle(
                article,
                article.getSuggestModelImageDtoList(),
                StaticModelProperties.NumOfTag);
    }

    /***
     * 训练／标注模块
     * @param article 待标注的带图文章，内含标题和内容
     * @return 一个结果列表，每个结果包括文章提取的关键词
     */
    public List<SuggestArticleKeywordsDto> doKeyword(SuggestModelArticleDto article) {
        return tagSuggestModel.suggestTagOfArticle(
                new RecommendArticleDto(article.getTitle(), article.getContent(), null),
                StaticModelProperties.NumOfTag);
    }

    /***
     * 关键词提取模块，同时考虑标题和内容
     * @param article 文章（无图）
     * @return 从文章中提取的关键词结果（包括文章id、关键词列表）
     */
    public List<SuggestArticleKeywordsDto> doSuggest(RecommendArticleDto article) {
        return tagSuggestModel.suggestTagOfArticle(article, modelConfig.getSuggestKeywordsNum());
    }

    /***
     * 关键词提取模块，仅考虑标题召回
     * @param article 文章（无图）
     * @return 从文章中提取的关键词结果（包括文章id、关键词列表）
     */
    public List<SuggestArticleKeywordsDto> doSuggestViaTitle(RecommendArticleDto article) {
        return tagSuggestModel.suggestTagOfArticleViaTitle(article, modelConfig.getSuggestKeywordsNum());
    }

    /***
     * 关键词提取模块，仅考虑内容召回
     * @param article 文章（无图）
     * @return 从文章中提取的关键词结果（包括文章id、关键词列表）
     */
    public List<SuggestArticleKeywordsDto> doSuggestViaContent(RecommendArticleDto article) {
        return tagSuggestModel.suggestTagOfArticleViaContent(article, modelConfig.getSuggestKeywordsNum());
    }

    /***
     * 主题抽取模块
     * @param content 文章内容
     * @return 文章内容在各个主题上的权重分布
     */
    public List<Double> doTopics(String content) {
        return tagSuggestModel.suggestTopicDistribution(content);
    }

    /***
     * 训练模型
     * @param dataset 训练集
     * @return
     */
    public String train(List<SuggestModelArticleDto> dataset) {
        return tagSuggestModel.trainModel(dataset);
    }

    /***
     * 加载模型
     * @param modelPath 模型路径
     * @return 加载成功返回True
     */
    public boolean loadModel(String modelPath) {
        return tagSuggestModel.loadModel(modelPath);
    }

    /***
     * 加载主题模型
     * @param ldaModelPath 主题模型路径
     * @return 加载成功返回True
     */
    public boolean loadLdaModel(String ldaModelPath) {
        return tagSuggestModel.loadLdaModel(ldaModelPath);
    }

}
